package br.com.jdcanado.gae.inforse.model;

import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.jdo.PersistenceManager;

import br.com.jdcanado.gae.inforse.controller.PMF;
import br.com.jdcanado.gae.inforse.model.ValorOrcamento.CustoFixo;
import br.com.jdcanado.gae.inforse.model.ValorOrcamento.CustoOperacional;

import com.google.appengine.api.datastore.Key;

public class ValorOrcamentoDAO {
	public static void inserirCustoFixo(ValorOrcamento valorOrcamento, Key orcamentoKey){
		PersistenceManager pm = PMF.get().getPersistenceManager();
		pm.setDetachAllOnCommit(true);
		
		try{
			Orcamento orcamento = pm.getObjectById(Orcamento.class, orcamentoKey);
			
			if(valorOrcamento.getId() != null){
				ValorOrcamento valorOrcamentoAtualizado = pm.getObjectById(ValorOrcamento.class, valorOrcamento.getId());
				ValorOrcamento detachedValorOrcamento = pm.detachCopy(valorOrcamentoAtualizado);
				CustoFixo detachedCustoFixo = pm.detachCopy(valorOrcamentoAtualizado.getCustoFixo());
				detachedValorOrcamento.setCustoFixo(detachedCustoFixo);
				List<CustoProfissionais> detachedCustoProfissionaisSets = (List<CustoProfissionais>) pm.detachCopyAll(valorOrcamentoAtualizado.getCustoProfissionaisSets());
				detachedValorOrcamento.setCustoProfissionaisSets(detachedCustoProfissionaisSets);
				
				detachedValorOrcamento.getCustoFixo().setAgua(valorOrcamento.getCustoFixo().getAgua());
				detachedValorOrcamento.getCustoFixo().setAluguel(valorOrcamento.getCustoFixo().getAluguel());
				detachedValorOrcamento.getCustoFixo().setDespesasBancarias(valorOrcamento.getCustoFixo().getDespesasBancarias());
				detachedValorOrcamento.getCustoFixo().setDespesaViagens(valorOrcamento.getCustoFixo().getDespesaViagens());
				detachedValorOrcamento.getCustoFixo().setHonorariosContabeis(valorOrcamento.getCustoFixo().getHonorariosContabeis());
				detachedValorOrcamento.getCustoFixo().setJuros(valorOrcamento.getCustoFixo().getJuros());
				detachedValorOrcamento.getCustoFixo().setLuz(valorOrcamento.getCustoFixo().getLuz());
				detachedValorOrcamento.getCustoFixo().setManutencaoVeicular(valorOrcamento.getCustoFixo().getManutencaoVeicular());
				detachedValorOrcamento.getCustoFixo().setMaterialExpediente(valorOrcamento.getCustoFixo().getMaterialExpediente());
				detachedValorOrcamento.getCustoFixo().setPertinentesVariados(valorOrcamento.getCustoFixo().getPertinentesVariados());
				detachedValorOrcamento.getCustoFixo().setProLabore(valorOrcamento.getCustoFixo().getProLabore());
				detachedValorOrcamento.getCustoFixo().setPublicidade(valorOrcamento.getCustoFixo().getPublicidade());
				detachedValorOrcamento.getCustoFixo().setQtdHorasMes(valorOrcamento.getCustoFixo().getQtdHorasMes());
				detachedValorOrcamento.getCustoFixo().setSalarioAdministrativo(valorOrcamento.getCustoFixo().getSalarioAdministrativo());
				detachedValorOrcamento.getCustoFixo().setSeguros(valorOrcamento.getCustoFixo().getSeguros());
				detachedValorOrcamento.getCustoFixo().setTelefone(valorOrcamento.getCustoFixo().getTelefone());
				detachedValorOrcamento.getCustoFixo().setServicosInternet(valorOrcamento.getCustoFixo().getServicosInternet());
				detachedValorOrcamento.getCustoFixo().setOutros(valorOrcamento.getCustoFixo().getOutros());
								
				
				pm.makePersistent(detachedValorOrcamento);
			}else{
				orcamento.setValorOrcamento(valorOrcamento);				
				pm.makePersistent(orcamento);
			}		
		}catch(Exception e){
			FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), "erroLogin");
			FacesContext.getCurrentInstance().addMessage(null, fm);
		}finally{
			pm.close();
		}
	}
	
	public static void inserirCustoOperacional(ValorOrcamento valorOrcamento, Key orcamentoKey){
		PersistenceManager pm = PMF.get().getPersistenceManager();
		pm.setDetachAllOnCommit(true);
		
		try{
			Orcamento orcamento = pm.getObjectById(Orcamento.class, orcamentoKey);
			
			if(valorOrcamento.getId() != null){
				ValorOrcamento valorOrcamentoAtualizado = pm.getObjectById(ValorOrcamento.class, valorOrcamento.getId());
				ValorOrcamento detachedValorOrcamento = pm.detachCopy(valorOrcamentoAtualizado);
				CustoOperacional detachedCustoOperacional = pm.detachCopy(valorOrcamentoAtualizado.getCustoOperacional());
				detachedValorOrcamento.setCustoOperacional(detachedCustoOperacional);
				List<CustoProfissionais> detachedCustoProfissionaisSets = (List<CustoProfissionais>) pm.detachCopyAll(valorOrcamentoAtualizado.getCustoProfissionaisSets());
				detachedValorOrcamento.setCustoProfissionaisSets(detachedCustoProfissionaisSets);
				CustoFixo detachedCustoFixo = pm.detachCopy(valorOrcamentoAtualizado.getCustoFixo());
				detachedValorOrcamento.setCustoFixo(detachedCustoFixo);
				
				detachedValorOrcamento.getCustoOperacional().setKmRodados(valorOrcamento.getCustoOperacional().getKmRodados());
				detachedValorOrcamento.getCustoOperacional().setKmLitro(valorOrcamento.getCustoOperacional().getKmLitro());
				detachedValorOrcamento.getCustoOperacional().setValorLitro(valorOrcamento.getCustoOperacional().getValorLitro());
				detachedValorOrcamento.getCustoOperacional().setValorDepreciacao(valorOrcamento.getCustoOperacional().getValorDepreciacao());
				detachedValorOrcamento.getCustoOperacional().setDiasAlimentacao(valorOrcamento.getCustoOperacional().getDiasAlimentacao());
				detachedValorOrcamento.getCustoOperacional().setValorRefeicao(valorOrcamento.getCustoOperacional().getValorRefeicao());
				detachedValorOrcamento.getCustoOperacional().setQtdRefeicoes(valorOrcamento.getCustoOperacional().getQtdRefeicoes());
				detachedValorOrcamento.getCustoOperacional().setDiasAcomodacao(valorOrcamento.getCustoOperacional().getDiasAcomodacao());
				detachedValorOrcamento.getCustoOperacional().setValorAcomodacao(valorOrcamento.getCustoOperacional().getValorAcomodacao());
				detachedValorOrcamento.getCustoOperacional().setQtdPassagem(valorOrcamento.getCustoOperacional().getQtdPassagem());
				detachedValorOrcamento.getCustoOperacional().setValorPassagem(valorOrcamento.getCustoOperacional().getValorPassagem());
				detachedValorOrcamento.getCustoOperacional().setPedagio(valorOrcamento.getCustoOperacional().getPedagio());
				detachedValorOrcamento.getCustoOperacional().setPertinentes(valorOrcamento.getCustoOperacional().getPertinentes());
				detachedValorOrcamento.getCustoOperacional().setQtdDiasAluguelCarro(valorOrcamento.getCustoOperacional().getQtdDiasAluguelCarro());
				detachedValorOrcamento.getCustoOperacional().setValorAluguelCarro(valorOrcamento.getCustoOperacional().getValorAluguelCarro());
				
				pm.makePersistent(detachedValorOrcamento);
			}else{
				orcamento.setValorOrcamento(valorOrcamento);				
				pm.makePersistent(orcamento);
			}		
		}catch(Exception e){
			FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), "erroLogin");
			FacesContext.getCurrentInstance().addMessage(null, fm);
		}finally{
			pm.close();
		}
	}
	
	public static void inserirTotalOrcamental(TotalOrcamental totalOrcamental, Key orcamentoKey){
		PersistenceManager pm = PMF.get().getPersistenceManager();
		pm.setDetachAllOnCommit(true);
		
		try{
			Orcamento orcamento = pm.getObjectById(Orcamento.class, orcamentoKey);
			Orcamento detachedOrcamento = pm.detachCopy(orcamento);
			ValorOrcamento valorOrcamento = pm.getObjectById(ValorOrcamento.class, orcamento.getValorOrcamento().getId());
			ValorOrcamento detachedValorOrcamento = pm.detachCopy(valorOrcamento);
			TotalOrcamental totalOrcamentalAtualizado = pm.getObjectById(TotalOrcamental.class, totalOrcamental.getId());
			TotalOrcamental detachedTotalOrcamental = pm.detachCopy(totalOrcamentalAtualizado);
			
			detachedTotalOrcamental.setDescontoOrcamento(totalOrcamental.getDescontoOrcamento());
			detachedTotalOrcamental.setPorcentagemLucro(totalOrcamental.getPorcentagemLucro());
			detachedTotalOrcamental.setValorLucro(totalOrcamental.getValorLucro());
			detachedTotalOrcamental.setQtdHorasViagem(totalOrcamental.getQtdHorasViagem());
			detachedTotalOrcamental.setQtdHorasComplementos(totalOrcamental.getQtdHorasComplementos());
			detachedTotalOrcamental.setQtdHorasCustoFixo(totalOrcamental.getQtdHorasCustoFixo());
			detachedTotalOrcamental.setQtdHorasVistoria(totalOrcamental.getQtdHorasVistoria());
			
			detachedOrcamento.setStatus("Em Atendimento");
			detachedOrcamento.setCorStatus("background-color:yellow;");
			detachedOrcamento.setValorOrcamento(detachedValorOrcamento);
			detachedOrcamento.getValorOrcamento().setTotalOrcamental(detachedTotalOrcamental);
			
			pm.makePersistent(detachedOrcamento);
			FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_INFO, "Orçamento calculado!", "message");
			FacesContext.getCurrentInstance().addMessage(null, fm);			
		}catch(Exception e){
			FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), "erroLogin");
			FacesContext.getCurrentInstance().addMessage(null, fm);
		}finally{
			pm.close();
		}
	}
	
	public static ValorOrcamento queryValorOrcamentosByKey(Key valorOrcamentoKey){
		PersistenceManager pm = PMF.get().getPersistenceManager();
				
		try{
			ValorOrcamento valorOrcamento = pm.getObjectById(ValorOrcamento.class, valorOrcamentoKey);
			return valorOrcamento;
		}catch(Exception e){
			FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), "erroLogin");
			FacesContext.getCurrentInstance().addMessage(null, fm);
			return null;
		}finally{
			pm.close();
		}
	}
	
	public static void inserirEncargo(Encargo encargo, Key totalOrcamentalKey){
		PersistenceManager pm = PMF.get().getPersistenceManager();
		
		try{
			TotalOrcamental totalOrcamental = pm.getObjectById(TotalOrcamental.class, totalOrcamentalKey);
			totalOrcamental.getEncargoSets().add(encargo);
			
			pm.makePersistent(totalOrcamental);			
		}catch(Exception e){
			FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), "erroLogin");
			FacesContext.getCurrentInstance().addMessage(null, fm);
		}finally{
			pm.close();
		}
	}
	
	public static void removerEncargo(Encargo encargo, Key totalOrcamentalKey){
		PersistenceManager pm = PMF.get().getPersistenceManager();
		
		try{
			TotalOrcamental totalOrcamental = pm.getObjectById(TotalOrcamental.class, totalOrcamentalKey);
			
			for(int i = 0; i < totalOrcamental.getEncargoSets().size(); i++){
				if(totalOrcamental.getEncargoSets().get(i).getId().getId() == encargo.getId().getId()){
					totalOrcamental.getEncargoSets().remove(i);
				}
			}
			
			pm.makePersistent(totalOrcamental);			
		}catch(Exception e){
			FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), "erroLogin");
			FacesContext.getCurrentInstance().addMessage(null, fm);
		}finally{
			pm.close();
		}
	}
	
	public static void inserirCustoProfissionais(CustoProfissionais custoProfissionais, Key valorOrcamentoKey){
		PersistenceManager pm = PMF.get().getPersistenceManager();
		
		try{
			ValorOrcamento valorOrcamento = pm.getObjectById(ValorOrcamento.class, valorOrcamentoKey);
			valorOrcamento.getCustoProfissionaisSets().add(custoProfissionais);
			
			pm.makePersistent(valorOrcamento);
		}catch(Exception e){
			FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), "erroLogin");
			FacesContext.getCurrentInstance().addMessage(null, fm);
		}finally{
			pm.close();
		}		
	}
	
	public static void removerCustoProfissionais(CustoProfissionais custoProfissionais, Key valorOrcamentoKey){
		PersistenceManager pm = PMF.get().getPersistenceManager();
		
		try{
			ValorOrcamento valorOrcamento = pm.getObjectById(ValorOrcamento.class, valorOrcamentoKey);
			
			for(int i=0; i < valorOrcamento.getCustoProfissionaisSets().size(); i++){
				if(custoProfissionais.getId().getId() == valorOrcamento.getCustoProfissionaisSets().get(i).getId().getId()){
					valorOrcamento.getCustoProfissionaisSets().remove(i);
				}
			}
			
			pm.makePersistent(valorOrcamento);
		}catch(Exception e){
			FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), "erroLogin");
			FacesContext.getCurrentInstance().addMessage(null, fm);
		}finally{
			pm.close();
		}
	}

}
